@@ -112,6 +112,25 @@ struct tpm2_crb_smc {
112112 u32 smc_func_id ;
113113};
114114
115+ static bool crb_wait_for_reg_32 (u32 __iomem * reg , u32 mask , u32 value ,
116+ unsigned long timeout )
117+ {
118+ ktime_t start ;
119+ ktime_t stop ;
120+
121+ start = ktime_get ();
122+ stop = ktime_add (start , ms_to_ktime (timeout ));
123+
124+ do {
125+ if ((ioread32 (reg ) & mask ) == value )
126+ return true;
127+
128+ usleep_range (50 , 100 );
129+ } while (ktime_before (ktime_get (), stop ));
130+
131+ return ((ioread32 (reg ) & mask ) == value );
132+ }
133+
115134/**
116135 * crb_go_idle - request tpm crb device to go the idle state
117136 *
@@ -128,38 +147,25 @@ struct tpm2_crb_smc {
128147 *
129148 * Return: 0 always
130149 */
131- static int __maybe_unused crb_go_idle (struct device * dev , struct crb_priv * priv )
150+ static int crb_go_idle (struct device * dev , struct crb_priv * priv )
132151{
133152 if ((priv -> sm == ACPI_TPM2_START_METHOD ) ||
134153 (priv -> sm == ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD ) ||
135154 (priv -> sm == ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC ))
136155 return 0 ;
137156
138157 iowrite32 (CRB_CTRL_REQ_GO_IDLE , & priv -> regs_t -> ctrl_req );
139- /* we don't really care when this settles */
140158
159+ if (!crb_wait_for_reg_32 (& priv -> regs_t -> ctrl_req ,
160+ CRB_CTRL_REQ_GO_IDLE /* mask */ ,
161+ 0 , /* value */
162+ TPM2_TIMEOUT_C )) {
163+ dev_warn (dev , "goIdle timed out\n" );
164+ return - ETIME ;
165+ }
141166 return 0 ;
142167}
143168
144- static bool crb_wait_for_reg_32 (u32 __iomem * reg , u32 mask , u32 value ,
145- unsigned long timeout )
146- {
147- ktime_t start ;
148- ktime_t stop ;
149-
150- start = ktime_get ();
151- stop = ktime_add (start , ms_to_ktime (timeout ));
152-
153- do {
154- if ((ioread32 (reg ) & mask ) == value )
155- return true;
156-
157- usleep_range (50 , 100 );
158- } while (ktime_before (ktime_get (), stop ));
159-
160- return false;
161- }
162-
163169/**
164170 * crb_cmd_ready - request tpm crb device to enter ready state
165171 *
@@ -175,8 +181,7 @@ static bool crb_wait_for_reg_32(u32 __iomem *reg, u32 mask, u32 value,
175181 *
176182 * Return: 0 on success -ETIME on timeout;
177183 */
178- static int __maybe_unused crb_cmd_ready (struct device * dev ,
179- struct crb_priv * priv )
184+ static int crb_cmd_ready (struct device * dev , struct crb_priv * priv )
180185{
181186 if ((priv -> sm == ACPI_TPM2_START_METHOD ) ||
182187 (priv -> sm == ACPI_TPM2_COMMAND_BUFFER_WITH_START_METHOD ) ||
@@ -195,33 +200,57 @@ static int __maybe_unused crb_cmd_ready(struct device *dev,
195200 return 0 ;
196201}
197202
198- static int crb_request_locality (struct tpm_chip * chip , int loc )
203+ static int __crb_request_locality (struct device * dev ,
204+ struct crb_priv * priv , int loc )
199205{
200- struct crb_priv * priv = dev_get_drvdata (& chip -> dev );
201206 u32 value = CRB_LOC_STATE_LOC_ASSIGNED |
202- CRB_LOC_STATE_TPM_REG_VALID_STS ;
207+ CRB_LOC_STATE_TPM_REG_VALID_STS ;
203208
204209 if (!priv -> regs_h )
205210 return 0 ;
206211
207212 iowrite32 (CRB_LOC_CTRL_REQUEST_ACCESS , & priv -> regs_h -> loc_ctrl );
208213 if (!crb_wait_for_reg_32 (& priv -> regs_h -> loc_state , value , value ,
209214 TPM2_TIMEOUT_C )) {
210- dev_warn (& chip -> dev , "TPM_LOC_STATE_x.requestAccess timed out\n" );
215+ dev_warn (dev , "TPM_LOC_STATE_x.requestAccess timed out\n" );
211216 return - ETIME ;
212217 }
213218
214219 return 0 ;
215220}
216221
217- static void crb_relinquish_locality (struct tpm_chip * chip , int loc )
222+ static int crb_request_locality (struct tpm_chip * chip , int loc )
218223{
219224 struct crb_priv * priv = dev_get_drvdata (& chip -> dev );
220225
226+ return __crb_request_locality (& chip -> dev , priv , loc );
227+ }
228+
229+ static int __crb_relinquish_locality (struct device * dev ,
230+ struct crb_priv * priv , int loc )
231+ {
232+ u32 mask = CRB_LOC_STATE_LOC_ASSIGNED |
233+ CRB_LOC_STATE_TPM_REG_VALID_STS ;
234+ u32 value = CRB_LOC_STATE_TPM_REG_VALID_STS ;
235+
221236 if (!priv -> regs_h )
222- return ;
237+ return 0 ;
223238
224239 iowrite32 (CRB_LOC_CTRL_RELINQUISH , & priv -> regs_h -> loc_ctrl );
240+ if (!crb_wait_for_reg_32 (& priv -> regs_h -> loc_state , mask , value ,
241+ TPM2_TIMEOUT_C )) {
242+ dev_warn (dev , "TPM_LOC_STATE_x.requestAccess timed out\n" );
243+ return - ETIME ;
244+ }
245+
246+ return 0 ;
247+ }
248+
249+ static int crb_relinquish_locality (struct tpm_chip * chip , int loc )
250+ {
251+ struct crb_priv * priv = dev_get_drvdata (& chip -> dev );
252+
253+ return __crb_relinquish_locality (& chip -> dev , priv , loc );
225254}
226255
227256static u8 crb_status (struct tpm_chip * chip )
@@ -475,6 +504,10 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
475504 dev_warn (dev , FW_BUG "Bad ACPI memory layout" );
476505 }
477506
507+ ret = __crb_request_locality (dev , priv , 0 );
508+ if (ret )
509+ return ret ;
510+
478511 priv -> regs_t = crb_map_res (dev , priv , & io_res , buf -> control_address ,
479512 sizeof (struct crb_regs_tail ));
480513 if (IS_ERR (priv -> regs_t ))
@@ -531,6 +564,8 @@ static int crb_map_io(struct acpi_device *device, struct crb_priv *priv,
531564
532565 crb_go_idle (dev , priv );
533566
567+ __crb_relinquish_locality (dev , priv , 0 );
568+
534569 return ret ;
535570}
536571
@@ -588,10 +623,14 @@ static int crb_acpi_add(struct acpi_device *device)
588623 chip -> acpi_dev_handle = device -> handle ;
589624 chip -> flags = TPM_CHIP_FLAG_TPM2 ;
590625
591- rc = crb_cmd_ready (dev , priv );
626+ rc = __crb_request_locality (dev , priv , 0 );
592627 if (rc )
593628 return rc ;
594629
630+ rc = crb_cmd_ready (dev , priv );
631+ if (rc )
632+ goto out ;
633+
595634 pm_runtime_get_noresume (dev );
596635 pm_runtime_set_active (dev );
597636 pm_runtime_enable (dev );
@@ -601,12 +640,15 @@ static int crb_acpi_add(struct acpi_device *device)
601640 crb_go_idle (dev , priv );
602641 pm_runtime_put_noidle (dev );
603642 pm_runtime_disable (dev );
604- return rc ;
643+ goto out ;
605644 }
606645
607- pm_runtime_put (dev );
646+ pm_runtime_put_sync (dev );
608647
609- return 0 ;
648+ out :
649+ __crb_relinquish_locality (dev , priv , 0 );
650+
651+ return rc ;
610652}
611653
612654static int crb_acpi_remove (struct acpi_device * device )
0 commit comments