Lines Matching full:hw
49 struct ifcvf_adapter *vf_to_adapter(struct ifcvf_hw *hw) in vf_to_adapter() argument
51 return container_of(hw, struct ifcvf_adapter, vf); in vf_to_adapter()
54 static void __iomem *get_cap_addr(struct ifcvf_hw *hw, in get_cap_addr() argument
66 ifcvf= vf_to_adapter(hw); in get_cap_addr()
82 return hw->base[bar] + offset; in get_cap_addr()
99 int ifcvf_init_hw(struct ifcvf_hw *hw, struct pci_dev *pdev) in ifcvf_init_hw() argument
127 hw->common_cfg = get_cap_addr(hw, &cap); in ifcvf_init_hw()
128 IFCVF_DBG(pdev, "hw->common_cfg = %p\n", in ifcvf_init_hw()
129 hw->common_cfg); in ifcvf_init_hw()
133 &hw->notify_off_multiplier); in ifcvf_init_hw()
134 hw->notify_bar = cap.bar; in ifcvf_init_hw()
135 hw->notify_base = get_cap_addr(hw, &cap); in ifcvf_init_hw()
136 hw->notify_base_pa = pci_resource_start(pdev, cap.bar) + in ifcvf_init_hw()
138 IFCVF_DBG(pdev, "hw->notify_base = %p\n", in ifcvf_init_hw()
139 hw->notify_base); in ifcvf_init_hw()
142 hw->isr = get_cap_addr(hw, &cap); in ifcvf_init_hw()
143 IFCVF_DBG(pdev, "hw->isr = %p\n", hw->isr); in ifcvf_init_hw()
146 hw->net_cfg = get_cap_addr(hw, &cap); in ifcvf_init_hw()
147 IFCVF_DBG(pdev, "hw->net_cfg = %p\n", hw->net_cfg); in ifcvf_init_hw()
155 if (hw->common_cfg == NULL || hw->notify_base == NULL || in ifcvf_init_hw()
156 hw->isr == NULL || hw->net_cfg == NULL) { in ifcvf_init_hw()
161 hw->nr_vring = ifc_ioread16(&hw->common_cfg->num_queues); in ifcvf_init_hw()
163 for (i = 0; i < hw->nr_vring; i++) { in ifcvf_init_hw()
164 ifc_iowrite16(i, &hw->common_cfg->queue_select); in ifcvf_init_hw()
165 notify_off = ifc_ioread16(&hw->common_cfg->queue_notify_off); in ifcvf_init_hw()
166 hw->vring[i].notify_addr = hw->notify_base + in ifcvf_init_hw()
167 notify_off * hw->notify_off_multiplier; in ifcvf_init_hw()
168 hw->vring[i].notify_pa = hw->notify_base_pa + in ifcvf_init_hw()
169 notify_off * hw->notify_off_multiplier; in ifcvf_init_hw()
172 hw->lm_cfg = hw->base[IFCVF_LM_BAR]; in ifcvf_init_hw()
176 hw->common_cfg, hw->notify_base, hw->isr, in ifcvf_init_hw()
177 hw->net_cfg, hw->notify_off_multiplier); in ifcvf_init_hw()
182 u8 ifcvf_get_status(struct ifcvf_hw *hw) in ifcvf_get_status() argument
184 return ifc_ioread8(&hw->common_cfg->device_status); in ifcvf_get_status()
187 void ifcvf_set_status(struct ifcvf_hw *hw, u8 status) in ifcvf_set_status() argument
189 ifc_iowrite8(status, &hw->common_cfg->device_status); in ifcvf_set_status()
192 void ifcvf_reset(struct ifcvf_hw *hw) in ifcvf_reset() argument
194 hw->config_cb.callback = NULL; in ifcvf_reset()
195 hw->config_cb.private = NULL; in ifcvf_reset()
197 ifcvf_set_status(hw, 0); in ifcvf_reset()
199 ifcvf_get_status(hw); in ifcvf_reset()
202 static void ifcvf_add_status(struct ifcvf_hw *hw, u8 status) in ifcvf_add_status() argument
205 status |= ifcvf_get_status(hw); in ifcvf_add_status()
207 ifcvf_set_status(hw, status); in ifcvf_add_status()
208 ifcvf_get_status(hw); in ifcvf_add_status()
211 u64 ifcvf_get_hw_features(struct ifcvf_hw *hw) in ifcvf_get_hw_features() argument
213 struct virtio_pci_common_cfg __iomem *cfg = hw->common_cfg; in ifcvf_get_hw_features()
228 u64 ifcvf_get_features(struct ifcvf_hw *hw) in ifcvf_get_features() argument
230 return hw->hw_features; in ifcvf_get_features()
233 int ifcvf_verify_min_features(struct ifcvf_hw *hw, u64 features) in ifcvf_verify_min_features() argument
235 struct ifcvf_adapter *ifcvf = vf_to_adapter(hw); in ifcvf_verify_min_features()
245 void ifcvf_read_net_config(struct ifcvf_hw *hw, u64 offset, in ifcvf_read_net_config() argument
253 old_gen = ifc_ioread8(&hw->common_cfg->config_generation); in ifcvf_read_net_config()
256 *p++ = ifc_ioread8(hw->net_cfg + offset + i); in ifcvf_read_net_config()
258 new_gen = ifc_ioread8(&hw->common_cfg->config_generation); in ifcvf_read_net_config()
262 void ifcvf_write_net_config(struct ifcvf_hw *hw, u64 offset, in ifcvf_write_net_config() argument
271 ifc_iowrite8(*p++, hw->net_cfg + offset + i); in ifcvf_write_net_config()
274 static void ifcvf_set_features(struct ifcvf_hw *hw, u64 features) in ifcvf_set_features() argument
276 struct virtio_pci_common_cfg __iomem *cfg = hw->common_cfg; in ifcvf_set_features()
285 static int ifcvf_config_features(struct ifcvf_hw *hw) in ifcvf_config_features() argument
289 ifcvf = vf_to_adapter(hw); in ifcvf_config_features()
290 ifcvf_set_features(hw, hw->req_features); in ifcvf_config_features()
291 ifcvf_add_status(hw, VIRTIO_CONFIG_S_FEATURES_OK); in ifcvf_config_features()
293 if (!(ifcvf_get_status(hw) & VIRTIO_CONFIG_S_FEATURES_OK)) { in ifcvf_config_features()
301 u16 ifcvf_get_vq_state(struct ifcvf_hw *hw, u16 qid) in ifcvf_get_vq_state() argument
308 ifcvf_lm = (struct ifcvf_lm_cfg __iomem *)hw->lm_cfg; in ifcvf_get_vq_state()
309 q_pair_id = qid / hw->nr_vring; in ifcvf_get_vq_state()
316 int ifcvf_set_vq_state(struct ifcvf_hw *hw, u16 qid, u16 num) in ifcvf_set_vq_state() argument
322 ifcvf_lm = (struct ifcvf_lm_cfg __iomem *)hw->lm_cfg; in ifcvf_set_vq_state()
323 q_pair_id = qid / hw->nr_vring; in ifcvf_set_vq_state()
325 hw->vring[qid].last_avail_idx = num; in ifcvf_set_vq_state()
331 static int ifcvf_hw_enable(struct ifcvf_hw *hw) in ifcvf_hw_enable() argument
337 ifcvf = vf_to_adapter(hw); in ifcvf_hw_enable()
338 cfg = hw->common_cfg; in ifcvf_hw_enable()
346 for (i = 0; i < hw->nr_vring; i++) { in ifcvf_hw_enable()
347 if (!hw->vring[i].ready) in ifcvf_hw_enable()
351 ifc_iowrite64_twopart(hw->vring[i].desc, &cfg->queue_desc_lo, in ifcvf_hw_enable()
353 ifc_iowrite64_twopart(hw->vring[i].avail, &cfg->queue_avail_lo, in ifcvf_hw_enable()
355 ifc_iowrite64_twopart(hw->vring[i].used, &cfg->queue_used_lo, in ifcvf_hw_enable()
357 ifc_iowrite16(hw->vring[i].size, &cfg->queue_size); in ifcvf_hw_enable()
367 ifcvf_set_vq_state(hw, i, hw->vring[i].last_avail_idx); in ifcvf_hw_enable()
374 static void ifcvf_hw_disable(struct ifcvf_hw *hw) in ifcvf_hw_disable() argument
379 cfg = hw->common_cfg; in ifcvf_hw_disable()
382 for (i = 0; i < hw->nr_vring; i++) { in ifcvf_hw_disable()
390 int ifcvf_start_hw(struct ifcvf_hw *hw) in ifcvf_start_hw() argument
392 ifcvf_reset(hw); in ifcvf_start_hw()
393 ifcvf_add_status(hw, VIRTIO_CONFIG_S_ACKNOWLEDGE); in ifcvf_start_hw()
394 ifcvf_add_status(hw, VIRTIO_CONFIG_S_DRIVER); in ifcvf_start_hw()
396 if (ifcvf_config_features(hw) < 0) in ifcvf_start_hw()
399 if (ifcvf_hw_enable(hw) < 0) in ifcvf_start_hw()
402 ifcvf_add_status(hw, VIRTIO_CONFIG_S_DRIVER_OK); in ifcvf_start_hw()
407 void ifcvf_stop_hw(struct ifcvf_hw *hw) in ifcvf_stop_hw() argument
409 ifcvf_hw_disable(hw); in ifcvf_stop_hw()
410 ifcvf_reset(hw); in ifcvf_stop_hw()
413 void ifcvf_notify_queue(struct ifcvf_hw *hw, u16 qid) in ifcvf_notify_queue() argument
415 ifc_iowrite16(qid, hw->vring[qid].notify_addr); in ifcvf_notify_queue()