Lines Matching refs:psp
45 int psp_mailbox_command(struct psp_device *psp, enum psp_cmd cmd, void *cmdbuff, in psp_mailbox_command() argument
51 if (!psp || !psp->vdata || !psp->vdata->cmdresp_reg || in psp_mailbox_command()
52 !psp->vdata->cmdbuff_addr_lo_reg || !psp->vdata->cmdbuff_addr_hi_reg) in psp_mailbox_command()
55 cmdresp_reg = psp->io_regs + psp->vdata->cmdresp_reg; in psp_mailbox_command()
56 cmdbuff_lo_reg = psp->io_regs + psp->vdata->cmdbuff_addr_lo_reg; in psp_mailbox_command()
57 cmdbuff_hi_reg = psp->io_regs + psp->vdata->cmdbuff_addr_hi_reg; in psp_mailbox_command()
59 mutex_lock(&psp->mailbox_mutex); in psp_mailbox_command()
77 mutex_unlock(&psp->mailbox_mutex); in psp_mailbox_command()
82 int psp_extended_mailbox_cmd(struct psp_device *psp, unsigned int timeout_msecs, in psp_extended_mailbox_cmd() argument
91 ret = psp_mailbox_command(psp, PSP_CMD_TEE_EXTENDED_CMD, (void *)req, in psp_extended_mailbox_cmd()
109 struct psp_device *psp; in psp_alloc_struct() local
111 psp = devm_kzalloc(dev, sizeof(*psp), GFP_KERNEL); in psp_alloc_struct()
112 if (!psp) in psp_alloc_struct()
115 psp->dev = dev; in psp_alloc_struct()
116 psp->sp = sp; in psp_alloc_struct()
118 snprintf(psp->name, sizeof(psp->name), "psp-%u", sp->ord); in psp_alloc_struct()
120 return psp; in psp_alloc_struct()
125 struct psp_device *psp = data; in psp_irq_handler() local
129 status = ioread32(psp->io_regs + psp->vdata->intsts_reg); in psp_irq_handler()
132 iowrite32(status, psp->io_regs + psp->vdata->intsts_reg); in psp_irq_handler()
136 if (psp->sev_irq_handler) in psp_irq_handler()
137 psp->sev_irq_handler(irq, psp->sev_irq_data, status); in psp_irq_handler()
143 static unsigned int psp_get_capability(struct psp_device *psp) in psp_get_capability() argument
145 unsigned int val = ioread32(psp->io_regs + psp->vdata->feature_reg); in psp_get_capability()
155 dev_notice(psp->dev, "psp: unable to access the device: you might be running a broken BIOS.\n"); in psp_get_capability()
158 psp->capability.raw = val; in psp_get_capability()
163 static int psp_check_sev_support(struct psp_device *psp) in psp_check_sev_support() argument
166 if (!psp->capability.sev) { in psp_check_sev_support()
167 dev_dbg(psp->dev, "psp does not support SEV\n"); in psp_check_sev_support()
174 static int psp_check_tee_support(struct psp_device *psp) in psp_check_tee_support() argument
177 if (!psp->capability.tee) { in psp_check_tee_support()
178 dev_dbg(psp->dev, "psp does not support TEE\n"); in psp_check_tee_support()
185 static int psp_init(struct psp_device *psp) in psp_init() argument
189 if (!psp_check_sev_support(psp)) { in psp_init()
190 ret = sev_dev_init(psp); in psp_init()
195 if (!psp_check_tee_support(psp)) { in psp_init()
196 ret = tee_dev_init(psp); in psp_init()
201 if (psp->vdata->platform_access) { in psp_init()
202 ret = platform_access_dev_init(psp); in psp_init()
208 if (PSP_FEATURE(psp, DBC) || in psp_init()
209 psp->capability.dbc_thru_ext) { in psp_init()
210 ret = dbc_dev_init(psp); in psp_init()
216 ret = psp_init_hsti(psp); in psp_init()
226 struct psp_device *psp; in psp_dev_init() local
230 psp = psp_alloc_struct(sp); in psp_dev_init()
231 if (!psp) in psp_dev_init()
234 sp->psp_data = psp; in psp_dev_init()
236 psp->vdata = (struct psp_vdata *)sp->dev_vdata->psp_vdata; in psp_dev_init()
237 if (!psp->vdata) { in psp_dev_init()
243 psp->io_regs = sp->io_map; in psp_dev_init()
244 mutex_init(&psp->mailbox_mutex); in psp_dev_init()
246 ret = psp_get_capability(psp); in psp_dev_init()
251 iowrite32(0, psp->io_regs + psp->vdata->inten_reg); in psp_dev_init()
252 iowrite32(-1, psp->io_regs + psp->vdata->intsts_reg); in psp_dev_init()
255 ret = sp_request_psp_irq(psp->sp, psp_irq_handler, psp->name, psp); in psp_dev_init()
262 if (psp->sp->set_psp_master_device) in psp_dev_init()
263 psp->sp->set_psp_master_device(psp->sp); in psp_dev_init()
265 ret = psp_init(psp); in psp_dev_init()
270 iowrite32(-1, psp->io_regs + psp->vdata->inten_reg); in psp_dev_init()
280 sp_free_psp_irq(psp->sp, psp); in psp_dev_init()
296 struct psp_device *psp = sp->psp_data; in psp_dev_destroy() local
298 if (!psp) in psp_dev_destroy()
301 sev_dev_destroy(psp); in psp_dev_destroy()
303 tee_dev_destroy(psp); in psp_dev_destroy()
305 dbc_dev_destroy(psp); in psp_dev_destroy()
307 platform_access_dev_destroy(psp); in psp_dev_destroy()
309 sp_free_psp_irq(sp, psp); in psp_dev_destroy()
315 void psp_set_sev_irq_handler(struct psp_device *psp, psp_irq_handler_t handler, in psp_set_sev_irq_handler() argument
318 psp->sev_irq_data = data; in psp_set_sev_irq_handler()
319 psp->sev_irq_handler = handler; in psp_set_sev_irq_handler()
322 void psp_clear_sev_irq_handler(struct psp_device *psp) in psp_clear_sev_irq_handler() argument
324 psp_set_sev_irq_handler(psp, NULL, NULL); in psp_clear_sev_irq_handler()