ctrl.c (a555af1707be7f564320cbb444ef68448ff16549) ctrl.c (771dbc3ac484af35cddf7e4971e66a1fd1a07156)
1/*
2 * QEMU NVM Express Controller
3 *
4 * Copyright (c) 2012, Intel Corporation
5 *
6 * Written by Keith Busch <keith.busch@intel.com>
7 *
8 * This code is licensed under the GNU GPL v2 or later.

--- 4440 unchanged lines hidden (view full) ---

4449
4450 if (!rae) {
4451 nvme_clear_events(n, NVME_AER_TYPE_SMART);
4452 }
4453
4454 return nvme_c2h(n, (uint8_t *) &smart + off, trans_len, req);
4455}
4456
1/*
2 * QEMU NVM Express Controller
3 *
4 * Copyright (c) 2012, Intel Corporation
5 *
6 * Written by Keith Busch <keith.busch@intel.com>
7 *
8 * This code is licensed under the GNU GPL v2 or later.

--- 4440 unchanged lines hidden (view full) ---

4449
4450 if (!rae) {
4451 nvme_clear_events(n, NVME_AER_TYPE_SMART);
4452 }
4453
4454 return nvme_c2h(n, (uint8_t *) &smart + off, trans_len, req);
4455}
4456
4457static uint16_t nvme_endgrp_info(NvmeCtrl *n, uint8_t rae, uint32_t buf_len,
4458 uint64_t off, NvmeRequest *req)
4459{
4460 uint32_t dw11 = le32_to_cpu(req->cmd.cdw11);
4461 uint16_t endgrpid = (dw11 >> 16) & 0xffff;
4462 struct nvme_stats stats = {};
4463 NvmeEndGrpLog info = {};
4464 int i;
4465
4466 if (!n->subsys || endgrpid != 0x1) {
4467 return NVME_INVALID_FIELD | NVME_DNR;
4468 }
4469
4470 if (off >= sizeof(info)) {
4471 return NVME_INVALID_FIELD | NVME_DNR;
4472 }
4473
4474 for (i = 1; i <= NVME_MAX_NAMESPACES; i++) {
4475 NvmeNamespace *ns = nvme_subsys_ns(n->subsys, i);
4476 if (!ns) {
4477 continue;
4478 }
4479
4480 nvme_set_blk_stats(ns, &stats);
4481 }
4482
4483 info.data_units_read[0] =
4484 cpu_to_le64(DIV_ROUND_UP(stats.units_read / 1000000000, 1000000000));
4485 info.data_units_written[0] =
4486 cpu_to_le64(DIV_ROUND_UP(stats.units_written / 1000000000, 1000000000));
4487 info.media_units_written[0] =
4488 cpu_to_le64(DIV_ROUND_UP(stats.units_written / 1000000000, 1000000000));
4489
4490 info.host_read_commands[0] = cpu_to_le64(stats.read_commands);
4491 info.host_write_commands[0] = cpu_to_le64(stats.write_commands);
4492
4493 buf_len = MIN(sizeof(info) - off, buf_len);
4494
4495 return nvme_c2h(n, (uint8_t *)&info + off, buf_len, req);
4496}
4497
4498
4457static uint16_t nvme_fw_log_info(NvmeCtrl *n, uint32_t buf_len, uint64_t off,
4458 NvmeRequest *req)
4459{
4460 uint32_t trans_len;
4461 NvmeFwSlotInfoLog fw_log = {
4462 .afi = 0x1,
4463 };
4464

--- 156 unchanged lines hidden (view full) ---

4621 case NVME_LOG_SMART_INFO:
4622 return nvme_smart_info(n, rae, len, off, req);
4623 case NVME_LOG_FW_SLOT_INFO:
4624 return nvme_fw_log_info(n, len, off, req);
4625 case NVME_LOG_CHANGED_NSLIST:
4626 return nvme_changed_nslist(n, rae, len, off, req);
4627 case NVME_LOG_CMD_EFFECTS:
4628 return nvme_cmd_effects(n, csi, len, off, req);
4499static uint16_t nvme_fw_log_info(NvmeCtrl *n, uint32_t buf_len, uint64_t off,
4500 NvmeRequest *req)
4501{
4502 uint32_t trans_len;
4503 NvmeFwSlotInfoLog fw_log = {
4504 .afi = 0x1,
4505 };
4506

--- 156 unchanged lines hidden (view full) ---

4663 case NVME_LOG_SMART_INFO:
4664 return nvme_smart_info(n, rae, len, off, req);
4665 case NVME_LOG_FW_SLOT_INFO:
4666 return nvme_fw_log_info(n, len, off, req);
4667 case NVME_LOG_CHANGED_NSLIST:
4668 return nvme_changed_nslist(n, rae, len, off, req);
4669 case NVME_LOG_CMD_EFFECTS:
4670 return nvme_cmd_effects(n, csi, len, off, req);
4671 case NVME_LOG_ENDGRP:
4672 return nvme_endgrp_info(n, rae, len, off, req);
4629 default:
4630 trace_pci_nvme_err_invalid_log_page(nvme_cid(req), lid);
4631 return NVME_INVALID_FIELD | NVME_DNR;
4632 }
4633}
4634
4635static void nvme_free_cq(NvmeCQueue *cq, NvmeCtrl *n)
4636{

--- 2740 unchanged lines hidden (view full) ---

7377}
7378
7379static void nvme_init_ctrl(NvmeCtrl *n, PCIDevice *pci_dev)
7380{
7381 NvmeIdCtrl *id = &n->id_ctrl;
7382 uint8_t *pci_conf = pci_dev->config;
7383 uint64_t cap = ldq_le_p(&n->bar.cap);
7384 NvmeSecCtrlEntry *sctrl = nvme_sctrl(n);
4673 default:
4674 trace_pci_nvme_err_invalid_log_page(nvme_cid(req), lid);
4675 return NVME_INVALID_FIELD | NVME_DNR;
4676 }
4677}
4678
4679static void nvme_free_cq(NvmeCQueue *cq, NvmeCtrl *n)
4680{

--- 2740 unchanged lines hidden (view full) ---

7421}
7422
7423static void nvme_init_ctrl(NvmeCtrl *n, PCIDevice *pci_dev)
7424{
7425 NvmeIdCtrl *id = &n->id_ctrl;
7426 uint8_t *pci_conf = pci_dev->config;
7427 uint64_t cap = ldq_le_p(&n->bar.cap);
7428 NvmeSecCtrlEntry *sctrl = nvme_sctrl(n);
7429 uint32_t ctratt;
7385
7386 id->vid = cpu_to_le16(pci_get_word(pci_conf + PCI_VENDOR_ID));
7387 id->ssvid = cpu_to_le16(pci_get_word(pci_conf + PCI_SUBSYSTEM_VENDOR_ID));
7388 strpadcpy((char *)id->mn, sizeof(id->mn), "QEMU NVMe Ctrl", ' ');
7389 strpadcpy((char *)id->fr, sizeof(id->fr), QEMU_VERSION, ' ');
7390 strpadcpy((char *)id->sn, sizeof(id->sn), n->params.serial, ' ');
7391
7392 id->cntlid = cpu_to_le16(n->cntlid);
7393
7394 id->oaes = cpu_to_le32(NVME_OAES_NS_ATTR);
7430
7431 id->vid = cpu_to_le16(pci_get_word(pci_conf + PCI_VENDOR_ID));
7432 id->ssvid = cpu_to_le16(pci_get_word(pci_conf + PCI_SUBSYSTEM_VENDOR_ID));
7433 strpadcpy((char *)id->mn, sizeof(id->mn), "QEMU NVMe Ctrl", ' ');
7434 strpadcpy((char *)id->fr, sizeof(id->fr), QEMU_VERSION, ' ');
7435 strpadcpy((char *)id->sn, sizeof(id->sn), n->params.serial, ' ');
7436
7437 id->cntlid = cpu_to_le16(n->cntlid);
7438
7439 id->oaes = cpu_to_le32(NVME_OAES_NS_ATTR);
7395 id->ctratt |= cpu_to_le32(NVME_CTRATT_ELBAS);
7440 ctratt = NVME_CTRATT_ELBAS;
7396
7397 id->rab = 6;
7398
7399 if (n->params.use_intel_id) {
7400 id->ieee[0] = 0xb3;
7401 id->ieee[1] = 0x02;
7402 id->ieee[2] = 0x00;
7403 } else {

--- 50 unchanged lines hidden (view full) ---

7454 nvme_init_subnqn(n);
7455
7456 id->psd[0].mp = cpu_to_le16(0x9c4);
7457 id->psd[0].enlat = cpu_to_le32(0x10);
7458 id->psd[0].exlat = cpu_to_le32(0x4);
7459
7460 if (n->subsys) {
7461 id->cmic |= NVME_CMIC_MULTI_CTRL;
7441
7442 id->rab = 6;
7443
7444 if (n->params.use_intel_id) {
7445 id->ieee[0] = 0xb3;
7446 id->ieee[1] = 0x02;
7447 id->ieee[2] = 0x00;
7448 } else {

--- 50 unchanged lines hidden (view full) ---

7499 nvme_init_subnqn(n);
7500
7501 id->psd[0].mp = cpu_to_le16(0x9c4);
7502 id->psd[0].enlat = cpu_to_le32(0x10);
7503 id->psd[0].exlat = cpu_to_le32(0x4);
7504
7505 if (n->subsys) {
7506 id->cmic |= NVME_CMIC_MULTI_CTRL;
7507 ctratt |= NVME_CTRATT_ENDGRPS;
7508
7509 id->endgidmax = cpu_to_le16(0x1);
7462 }
7463
7510 }
7511
7512 id->ctratt = cpu_to_le32(ctratt);
7513
7464 NVME_CAP_SET_MQES(cap, 0x7ff);
7465 NVME_CAP_SET_CQR(cap, 1);
7466 NVME_CAP_SET_TO(cap, 0xf);
7467 NVME_CAP_SET_CSS(cap, NVME_CAP_CSS_NVM);
7468 NVME_CAP_SET_CSS(cap, NVME_CAP_CSS_CSI_SUPP);
7469 NVME_CAP_SET_CSS(cap, NVME_CAP_CSS_ADMIN_ONLY);
7470 NVME_CAP_SET_MPSMAX(cap, 4);
7471 NVME_CAP_SET_CMBS(cap, n->params.cmb_size_mb ? 1 : 0);

--- 301 unchanged lines hidden ---
7514 NVME_CAP_SET_MQES(cap, 0x7ff);
7515 NVME_CAP_SET_CQR(cap, 1);
7516 NVME_CAP_SET_TO(cap, 0xf);
7517 NVME_CAP_SET_CSS(cap, NVME_CAP_CSS_NVM);
7518 NVME_CAP_SET_CSS(cap, NVME_CAP_CSS_CSI_SUPP);
7519 NVME_CAP_SET_CSS(cap, NVME_CAP_CSS_ADMIN_ONLY);
7520 NVME_CAP_SET_MPSMAX(cap, 4);
7521 NVME_CAP_SET_CMBS(cap, n->params.cmb_size_mb ? 1 : 0);

--- 301 unchanged lines hidden ---