Lines Matching defs:n2rng

49 #include <sys/n2rng.h>
163 n2rng_t *n2rng = NULL;
172 * Only instance 0 of n2rng driver is allowed.
181 n2rng = (n2rng_t *)ddi_get_soft_state(n2rng_softstate,
183 if (n2rng == NULL) {
187 return (n2rng_resume(n2rng));
200 n2rng = (n2rng_t *)ddi_get_soft_state(n2rng_softstate, instance);
201 ASSERT(n2rng != NULL);
202 n2rng->n_dip = dip;
204 mutex_init(&n2rng->n_lock, NULL, MUTEX_DRIVER, NULL);
205 n2rng->n_flags = 0;
206 n2rng->n_timeout_id = 0;
207 n2rng->n_sticks_per_usec = sticks_per_usec();
210 n2rng->n_binding_name = ddi_binding_name(dip);
211 if (strncmp(n2rng->n_binding_name, N2RNG_BINDNAME_N2,
216 n2rng->n_binding = N2RNG_CPU_N2;
217 } else if (strncmp(n2rng->n_binding_name, N2RNG_BINDNAME_VF,
222 n2rng->n_binding = N2RNG_CPU_VF;
223 } else if (strncmp(n2rng->n_binding_name, N2RNG_BINDNAME_KT,
228 n2rng->n_binding = N2RNG_CPU_KT;
231 "unable to determine n2rng (cpu) binding (%s)",
232 n2rng->n_binding_name);
235 DBG1(n2rng, DCHATTY, "n2rng_attach: n2rng->n_binding_name = %s",
236 n2rng->n_binding_name);
244 DBG4(n2rng, DCHATTY, "n2rng_attach: grp: 0x%lx, maj: %ld, "
263 DBG2(n2rng, DATTACH, "n2rng_attach: ncs api version (%ld.%ld)",
265 n2rng->n_hvapi_major_version = ncs_hsvc[ncs_version_index].hsvc_major;
266 n2rng->n_hvapi_minor_version = (uint_t)ncs_minor_ver;
272 if ((n2rng->n_binding != N2RNG_CPU_N2) &&
273 (n2rng->n_hvapi_major_version < 2)) {
274 cmn_err(CE_NOTE, "n2rng: Incompatible hyperviser api "
275 "version %d.%d detected", n2rng->n_hvapi_major_version,
276 n2rng->n_hvapi_minor_version);
280 if (n2rng_init_ctl(n2rng) != DDI_SUCCESS) {
281 cmn_err(CE_WARN, "n2rng: unable to initialize rng "
287 n2rng->n_taskq = ddi_taskq_create(dip, "n2rng_taskq", 1,
290 if (n2rng->n_taskq == NULL) {
296 if (ddi_taskq_dispatch(n2rng->n_taskq, n2rng_config_task,
297 (void *)n2rng, DDI_SLEEP) != DDI_SUCCESS) {
306 if (n2rng->n_taskq != NULL) {
307 ddi_taskq_destroy(n2rng->n_taskq);
308 n2rng->n_taskq = NULL;
311 n2rng_uninit_ctl(n2rng);
313 (void) n2rng_uninit(n2rng);
320 mutex_destroy(&n2rng->n_lock);
331 n2rng_t *n2rng;
335 n2rng = (n2rng_t *)ddi_get_soft_state(n2rng_softstate, instance);
336 if (n2rng == NULL) {
343 return (n2rng_suspend(n2rng));
351 if (n2rng->n_taskq != NULL) {
352 ddi_taskq_destroy(n2rng->n_taskq);
353 n2rng->n_taskq = NULL;
357 mutex_enter(&n2rng->n_lock);
358 tid = n2rng->n_timeout_id;
359 n2rng->n_timeout_id = 0;
360 mutex_exit(&n2rng->n_lock);
362 DBG1(n2rng, DCHATTY, "n2rng_detach: untimeout pending retry "
367 n2rng_uninit_ctl(n2rng);
370 rv = n2rng_uninit(n2rng) ? DDI_FAILURE : DDI_SUCCESS;
377 mutex_destroy(&n2rng->n_lock);
385 n2rng_suspend(n2rng_t *n2rng)
388 if (n2rng_uninit(n2rng) != DDI_SUCCESS) {
389 cmn_err(CE_WARN, "n2rng: unable to unregister from KCF");
398 n2rng_resume(n2rng_t *n2rng)
403 return (n2rng_config(n2rng));
448 cyclesleep(n2rng_t *n2rng, uint64_t delay_sticks)
462 usecs_to_wait = sticks_to_wait / n2rng->n_sticks_per_usec;
481 "n2rng: internal alignment "
485 cmn_err(CE_WARN, "n2rng: internal "
489 cmn_err(CE_WARN, "n2rng: access failure");
492 cmn_err(CE_WARN, "n2rng: hardware busy");
496 "n2rng: %s "
513 n2rng_collect_diag_bits(n2rng_t *n2rng, int rngid,
557 hverr = n2rng_ctl_write(n2rng, rngid, setupphys,
559 n2rng->n_ctl_data->n_watchdog_cycles, &tdelta);
571 DBG1(n2rng, DHEALTH,
577 cyclesleep(n2rng, tdelta);
588 DBG1(n2rng, DHEALTH,
618 hverr = n2rng_data_read_diag(n2rng, rngid,
634 DBG1(n2rng, DHEALTH,
641 cyclesleep(n2rng, tdelta);
664 hverr = n2rng_ctl_write(n2rng, rngid, setupphys,
665 exitstate, n2rng->n_ctl_data->n_watchdog_cycles,
678 DBG1(n2rng, DHEALTH,
684 cyclesleep(n2rng, tdelta);
695 DBG1(n2rng, DHEALTH,
721 n2rng_getentropy(n2rng_t *n2rng, void *buffer, size_t size)
752 if (n2rng->n_hvapi_major_version < 2) {
761 DBG2(n2rng, DHEALTH,
789 DBG1(n2rng, DHEALTH,
795 cyclesleep(n2rng, tdelta);
810 n2rng_ctl_read(n2rng_t *n2rng, int rngid, uint64_t ctlregs_pa, uint64_t *state,
817 if (n2rng->n_hvapi_major_version == 2) {
832 n2rng_ctl_wait(n2rng_t *n2rng, int rngid)
865 DBG1(n2rng, DHEALTH, "n2rng_ctl_wait: "
870 cyclesleep(n2rng, tdelta);
876 DBG1(n2rng, DHEALTH, "n2rng_ctl_wait: "
894 n2rng_ctl_write(n2rng_t *n2rng, int rngid, uint64_t ctlregs_pa,
900 if (n2rng->n_hvapi_major_version == 2) {
905 rv = n2rng_ctl_wait(n2rng, rngid);
916 n2rng_data_read_diag(n2rng_t *n2rng, int rngid, uint64_t data_pa,
922 if (n2rng->n_hvapi_major_version == 2) {
936 n2rng_check_ctl_access(n2rng_t *n2rng)
942 if (n2rng->n_hvapi_major_version == 2) {
962 n2rng_config_retry(n2rng_t *n2rng, clock_t seconds)
964 mutex_enter(&n2rng->n_lock);
966 if (n2rng->n_timeout_id) {
967 DBG1(n2rng, DCFG, "n2rng_config_retry: retry pending "
968 "id = %x", n2rng->n_timeout_id);
970 n2rng->n_timeout_id = timeout(n2rng_config_task,
971 (void *)n2rng, drv_usectohz(seconds * SECOND));
972 DBG2(n2rng, DCFG, "n2rng_config_retry: retry scheduled in "
973 "%d seconds, id = %x", seconds, n2rng->n_timeout_id);
975 mutex_exit(&n2rng->n_lock);
995 n2rng_init_ctl(n2rng_t *n2rng)
1003 n2rng->n_ctl_data = NULL;
1007 hverr = n2rng_check_ctl_access(n2rng);
1011 DBG1(n2rng, DHEALTH, "n2rng_int_ctl: exceeded busy "
1024 DBG0(n2rng, DATTACH,
1030 n2rng->n_ctl_data = kmem_alloc(sizeof (rng_ctl_data_t), KM_SLEEP);
1031 n2rng->n_ctl_data->n_num_rngs_online = 0;
1037 if (n2rng->n_hvapi_major_version < 2) {
1038 n2rng->n_ctl_data->n_num_rngs = 1;
1040 n2rng->n_ctl_data->n_num_rngs =
1041 ddi_getprop(DDI_DEV_T_ANY, n2rng->n_dip,
1044 if (n2rng->n_ctl_data->n_num_rngs == 0) {
1045 cmn_err(CE_WARN, "n2rng: %s property not found",
1052 n2rng->n_ctl_data->n_rngs =
1053 kmem_zalloc(n2rng->n_ctl_data->n_num_rngs *
1057 n2rng->n_ctl_data->n_accumulate_cycles =
1058 ddi_getprop(DDI_DEV_T_ANY, n2rng->n_dip,
1063 n2rng->n_ctl_data->n_hc_secs = ddi_getprop(DDI_DEV_T_ANY, n2rng->n_dip,
1068 if ((n2rng->n_hvapi_major_version < 2) &&
1069 (n2rng->n_ctl_data->n_hc_secs > 0)) {
1070 cmn_err(CE_WARN, "n2rng: Hyperviser api "
1072 n2rng->n_hvapi_major_version,
1073 n2rng->n_hvapi_minor_version);
1074 n2rng->n_ctl_data->n_hc_secs = 0;
1079 if (n2rng->n_ctl_data->n_hc_secs <= 0) {
1080 n2rng->n_ctl_data->n_watchdog_cycles = 0;
1082 n2rng->n_ctl_data->n_watchdog_cycles =
1084 n2rng->n_ctl_data->n_hc_secs) *
1085 n2rng->n_sticks_per_usec * 1000000;
1092 for (rngid = 0; rngid < n2rng->n_ctl_data->n_num_rngs; rngid++) {
1094 rng = &n2rng->n_ctl_data->n_rngs[rngid];
1119 n2rng_setcontrol(n2rng);
1120 DBG2(n2rng, DATTACH,
1122 n2rng->n_ctl_data->n_num_rngs,
1123 (n2rng->n_ctl_data->n_num_rngs == 1) ? "" : "s");
1124 DBG2(n2rng, DCFG,
1126 n2rng->n_sticks_per_usec,
1127 n2rng->n_ctl_data->n_hc_secs);
1128 DBG2(n2rng, DCFG,
1130 "n_accumulate_cycles = %ld", n2rng->n_ctl_data->n_watchdog_cycles,
1131 n2rng->n_ctl_data->n_accumulate_cycles);
1137 n2rng_uninit_ctl(n2rng_t *n2rng)
1139 if (n2rng->n_ctl_data) {
1140 if (n2rng->n_ctl_data->n_num_rngs) {
1141 kmem_free(n2rng->n_ctl_data->n_rngs,
1142 n2rng->n_ctl_data->n_num_rngs *
1144 n2rng->n_ctl_data->n_rngs = NULL;
1145 n2rng->n_ctl_data->n_num_rngs = 0;
1147 kmem_free(n2rng->n_ctl_data, sizeof (rng_ctl_data_t));
1148 n2rng->n_ctl_data = NULL;
1159 n2rng_config_test(n2rng_t *n2rng)
1194 DBG1(n2rng, DHEALTH, "n2rng_config_test: "
1199 cyclesleep(n2rng, tdelta);
1223 n2rng_config(n2rng_t *n2rng)
1233 if (n2rng_iscontrol(n2rng)) {
1235 for (rngid = 0; rngid < n2rng->n_ctl_data->n_num_rngs;
1238 rng = &n2rng->n_ctl_data->n_rngs[rngid];
1245 if ((n2rng->n_binding == N2RNG_CPU_VF) &&
1246 (n2rng->n_hvapi_major_version < 2)) {
1254 DBG1(n2rng, DCFG, "n2rng_config: "
1257 rv = n2rng_do_health_check(n2rng, rngid);
1260 rv = n2rng_do_health_check(n2rng, rngid);
1269 DBG1(n2rng, DCFG, "n2rng_config: rng(%d) "
1274 n2rng->n_ctl_data->n_num_rngs_online++;
1282 cmn_err(CE_WARN, "n2rng: rng(%d) "
1285 n2rng->n_ctl_data->n_num_rngs_online--;
1291 DBG2(n2rng, DCFG, "n2rng_config: %d rng%s online",
1292 n2rng->n_ctl_data->n_num_rngs_online,
1293 (n2rng->n_ctl_data->n_num_rngs_online == 1) ? "" : "s");
1296 if (n2rng->n_ctl_data->n_num_rngs_online == 0) {
1297 cmn_err(CE_WARN, "n2rng: %d RNG device%s failed",
1298 n2rng->n_ctl_data->n_num_rngs,
1299 (n2rng->n_ctl_data->n_num_rngs == 1) ? "" : "s");
1302 n2rng_setconfigured(n2rng);
1306 rv = n2rng_config_test(n2rng);
1309 n2rng_setconfigured(n2rng);
1324 if (n2rng_isconfigured(n2rng)) {
1326 if (n2rng_init(n2rng) != DDI_SUCCESS) {
1327 cmn_err(CE_WARN, "n2rng: unable to register with KCF");
1335 if (n2rng_iscontrol(n2rng) &&
1336 (n2rng->n_ctl_data->n_hc_secs > 0)) {
1337 n2rng_config_retry(n2rng,
1338 n2rng->n_ctl_data->n_hc_secs);
1340 } else if (!n2rng_isfailed(n2rng)) {
1342 n2rng_config_retry(n2rng, RNG_CFG_RETRY_SECS);
1348 (void) n2rng_unregister_provider(n2rng);
1349 n2rng_setfailed(n2rng);
1350 cmn_err(CE_WARN, "n2rng: hardware failure detected");
1362 n2rng_t *n2rng = (n2rng_t *)targ;
1364 mutex_enter(&n2rng->n_lock);
1365 n2rng->n_timeout_id = 0;
1366 mutex_exit(&n2rng->n_lock);
1367 (void) n2rng_config(n2rng);